#ifndef LHMODBUSLIB_H
#define LHMODBUSLIB_H
#include "modbusrwparam.h"
#include "mymodbus.h"
#include <QMap>
#include <QMetaType>
#include <QModbusDataUnit>
#include <QObject>
#include <QtCore/qglobal.h>
#if defined( LHMODBUSLIB_LIBRARY )
#define LHMODBUSLIB_EXPORT Q_DECL_EXPORT
#else
#define LHMODBUSLIB_EXPORT Q_DECL_IMPORT
#endif
/**
 * @brief The LHModbusLib class
 * 蓝海modbus封装库（串口屏）
 * 1.定时器，根据modbus.ini ModbsuReadFrequency频率定时读取ModbusRead.ini配置文件中地址的值。
 * 2.LHModbusLib库提供接口onModbusIntWriter(), 输入key名称，提取ModbusWriter.ini配置文件中的写地址。
 * 3.LHModbusLib库提供接口onModbusStringWriter(), 输入key名称，提取ModbusWriter.ini配置文件中的写地址。
 * 4.LHModbusLib库提供回调signalsModbusBack(), 返回QModbusDataUnit对象，返回key,返回info。提供modbus通讯状态，通讯异常，读结果。
 * 5.使用qt modbus 库 做主站
 * 6.LHModbusLib库提供接口onModbusListWrite(),写入步科屏幕列表数据
 * 7.使用库时，需在工程目录下配置config/Modbus.ini、ModbusRead.ini、ModbusWriter.ini ModbusListWriter.ini文件
 * 8.库对写入的数据（ModbusWriter.ini）缓存备份并判读是否重复，重复不进行写动作
 * 9.LHModbusLib库提供接口onModbusHighFrequencyWriter(),输入key名称，提取ModbusHighFrequencyWriter.ini配置文件中的写地址
 *
 */

class LHMODBUSLIB_EXPORT LHModbusLib : public QObject {
    Q_OBJECT

public:
    explicit LHModbusLib( QObject* parent = nullptr );
    ~LHModbusLib();
    void onModbusIntWriter( const QString& key, int data );
    void onModbusStringWriter( const QString& key, const QString data );
    void onModbusListWriter( const QString& key, bool isClear, const QStringList data );
    void onModbusHighFrequencyWriter( const QString& key, int data );
    void onModbusDisconnect();

signals:
    void signalsModbusBack( const QString& key, const QModbusDataUnit readData, const QString& info );

public slots:
    void slotModbusReadBack( const QModbusDataUnit readData );
    void slotModbusStateChange( const int& state );
    void slotModbusError( const QString& errorInfo );
    void slotModbusConnectSucessful();
    void slotLHModbusInit();
    void sltTimeOut();

private:
    void            onModbusRead();
    QModbusDataUnit onInitModbusDataUnit( const QString& name );
    void onConfigWriterString( QModbusDataUnit& writerStringUnit, const QString& data );
    bool onWriterIsSame( const QString& key, const QString& data );
    bool onWriterIsSame( const QString& key, const int& data );
    void onConfigWriterListInter( const QString& data, const ModbusRWParam::ModbusListIniMode& initListMode );

private:
    QList< QModbusDataUnit >* writerList = nullptr;               //缓存需要写的QModbusDataUnit
    MyModbus*                 myModbus   = nullptr;               //
    bool                      isError    = false;                 //
    QMap< QString, QModbusDataUnit >* writerListCache = nullptr;  //写缓存（对写数据备份一份避免重复写入）
    QModbusDataUnit hightFreqenceyUnit;                           // int高频率写Unit
};

#endif  // LHMODBUSLIB_H
